package com.github.zyflzz.cbca.java_implement;

import com.alibaba.fastjson.JSON;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

/**
 * <h2>数据加载器</h2>
 * 负责从 json 文件中加载多边形点集数据
 *
 * @author Zhou Yifan
 */
public class DataLoader {

    /**
     * 文件位置
     */
    private final String location;

    /**
     * 多边形数组
     */
    private double[][] polygon;

    /**
     * 加载用时，单位：毫秒
     */
    private long usedTime;

    /**
     * @param location 待加载文件的绝对路径
     * @throws Exception 加载过程中可能的异常，例如 IO 异常等
     */
    public DataLoader(String location) throws Exception {
        this.location = location;
        load();
    }

    /**
     * 加载数据
     *
     * @throws Exception 加载过程中可能的异常，例如 IO 异常等
     */
    private void load() throws Exception {
        long start = System.currentTimeMillis();
        String jsonData = getJson();
        List<String> list = JSON.parseArray(jsonData, String.class);
        int n = list.size();
        polygon = new double[n][2];
        List<Double> temp;
        for (int i = 0; i < list.size(); i++) {
            temp = JSON.parseArray(list.get(i), Double.class);
            polygon[i][0] = temp.get(0);
            polygon[i][1] = temp.get(1);
        }
        long end = System.currentTimeMillis();
        usedTime = end - start;
    }

    /**
     * 读取 json 文件
     *
     * @return json 字符串
     * @throws IOException IO 操作可能的一些异常
     */
    private String getJson() throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(location));
        StringBuilder builder = new StringBuilder();
        String temp = "";
        while ((temp = reader.readLine()) != null) {
            builder.append(temp);
        }
        reader.close();
        return builder.toString();
    }

    /**
     * @return 文件所在绝对位置
     */
    public String getLocation() {
        return location;
    }

    /**
     * @return 多边形数组
     */
    public double[][] getPolygon() {
        return polygon;
    }

    /**
     * @return 多边形定点数
     */
    public int getNumber() {
        return polygon.length;
    }

    /**
     * @return 加载用时，单位：毫秒
     */
    public long getUsedTime() {
        return usedTime;
    }
}
